const express = require('express');
const bp = require('body-parser');
const mount = require('mount-routes');
const expressJwt = require('express-jwt')
const path = require('path');
const setting = require('./setting.js');
const verify = require('./config/verify.js');

const app = express();

//引入post解析组件
app.use(bp.urlencoded({
	extend: true
}));
app.use(bp.json())

// 设置跨域和相应数据格式
app.all('/*', function(req, res, next) {	
	res.header('Access-Control-Allow-Origin', '*')
	res.header('Access-Control-Allow-Headers', 'X-Requested-With, mytoken')
	res.header('Access-Control-Allow-Headers', 'X-Requested-With, Authorization')
	res.setHeader('Content-Type', 'application/json;charset=utf-8')
	res.header('Access-Control-Allow-Headers',
		'Content-Type,Content-Length, Authorization, Accept,X-Requested-With')
	res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS')
	res.header('X-Powered-By', ' 3.2.1')
	if (req.method == 'OPTIONS') res.send(200)
	/*让options请求快速返回*/
	else next()
})


 //  判断token是否有效，有效就进行token的统一解析
// 解析token获取用户信息
// use 既能匹配get请求又能匹配post请求 (能请求各种请求)  use第一个参数不写就是匹配所有请求，或者可以写成'/*'
app.use((req, res, next) => {
	// 获取请求头中的参数 token
	let token = req.headers[setting.token.header]
	if (token === undefined) {
		// 如果请求头中没有token信息，直接截止 
		return next()
	} else {
		// console.log(token);
		// token校验并将校验结果保存至请求头中  解析token，并把解析出来的信息存到请求头中
		verify.getToken(token).then(data => {
			// console.log(data)
			req.data = data
			return next()
		}).catch(_ => {
			return next()
		})
	}
})
//验证token是否过期并规定哪些路由不用验证
app.use(expressJwt({
	secret: setting.token.signKey,
	algorithms: ['HS256']
}).unless({
	//除了这个地址，其他的URL都需要验证
	path: setting.token.unRoute
}))

//当token失效返回提示信息
app.use((err, req, res, next) => {
	if (err.status === 401) {
		return res.status(err.status).json({
			status: err.status,
			msg: 'The token is invalid',
			error: err.name + ':' + err.message
		})
	}
})



//引入路由 会把所有的路由打印到控制台上  process.cwd()获得当前文件的路径
mount(app, path.join(process.cwd(), '/router'), true)

//统一错误处理
app.use((req, res, next) => {
	res.send({
		meta: {
			msg: '请求的url不存在',
			status: 404
		}
	});
})

//启动web服务器
app.listen(8889)

module.exports = app;
